(for Internet Explorer)
ファイルの文字 コード セットを判定します。
【引数】
Path
文字コードを判定するファイルのパス
Function  AnalyzeCharacterCodeSet( Path as string ) as integer or string
返り値
文字 コード セット
MIME
を使って開きなおしてください。
HTML
の charset によって、文字コードが指定される場合は、文字コードを調べて
XML宣言 (?xml)
の encoding="UTF-8" があるとき
c.No_BOM
c.UTF_8_No_BOM
先頭に BOM がなく、
先頭に BOM がなく、
(文字列)
の encoding があり、"UTF-8" 以外のとき
XML宣言 (?xml)
先頭に BOM がなく、
XML宣言 (?xml)
の encoding がないとき
new_TextFileCharSetStack が UTF-8 のとき
の encoding がなく、
XML宣言 (?xml)
先頭に BOM がなく、
返り値
サンプル
    Set cs = new_TextFileCharSetStack( AnalyzeCharacterCodeSet( "File1.txt" ) )
    CreateFile  "File1.txt", "abc"
    cs = Empty
同じ文字コードを使ってファイルを作成する
File1.txt
関連
→ 文字エンコーディングの指定方法
c.UTF_8
c.Unicode
先頭に UTF-8 の BOM (EF BB BF) があるとき
先頭に UTF-16 の BOM (FF FE) があるとき
テスト
ソース
→ vbslib.vbs
→ T_Binary.vbs
本関数は、バージョンによって解析の性能が異なります。
現在のバージョンは、以下の方法で解析しています。
WHITE SQUARE エンコーディング判定法 (独自)
の encoding
XML宣言 (?xml)
Unicode の BOM (ByteOrderMaker)
Empty
解析できないとき、Windows の OEMのとき、ファイルがないとき
T_AnalyzeCharacterCodeSet
→ vbslib_helper.c
ReadCharacterEncodingCharacterCommand
ファイルの文字コードを判定するために、ファイルの先頭にある BOM を読みます。
【引数】
Path
文字コードを判定するファイルのパス
Function  ReadUnicodeFileBOM( Path as string ) as integer
返り値
BOM の文字コード
テスト
→ T_File.vbs
T_ReadUnicodeFileBOM
ソース
→ vbslib.vbs
返り値
ファイルが無いとき
Empty
c.UTF_8
c.Unicode
先頭に UTF-8 の BOM (EF BB BF) があるとき
先頭に UTF-16 の BOM (FF FE) があるとき
Set c = g_VBS_Lib です。
c.No_BOM
BOM がないとき
関連
vbslib の文字コード セットの数値から、文字列に変換します。
【引数】
in_CharacterCodeSetConstant
vbslib の文字コード セットの数値
Function  GetStringFromCharacterCodeSet(
    in_CharacterCodeSetConstant as integer or string ) as string
返り値
文字コード セットの文字列
サンプル
    Assert  GetStringFromCharacterCodeSet( g_VBS_Lib.Shift_JIS ) = "Shift_JIS"
c.No_BOM
詳細
c.Shift_JIS
"Shift_JIS"
vbslib の
文字コード
セットの数値
文字コード
セットの文字列
c.EUC_JP
"EUC-JP"
c.Unicode
"Unicode"
仕様の理由
Shift_JIS は、
HTML
の、META タグの charset 属性に指定できる値です。
c.UTF_8
"UTF-8"
c.UTF_8_No_BOM
"UTF-8-No-BOM"
c.ISO_2022_JP
"ISO-2022-JP"
Empty
"Shift_JIS"
"Shift_JIS"
テスト
→ T_File.vbs
T_GetStringFromCharacterCodeSet
ソース
→ vbslib.vbs
関連
文字コード セットの文字列から、vbslib の数値に変換します。
【引数】
in_CharacterCodeSetString
文字コード セットの文字列
Function  GetCharacterCodeSetFromString(
    in_CharacterCodeSetString as string ) as integr or string
返り値
vbslib の文字コード セットの数値
サンプル
    Assert  GetCharacterCodeSetFromString( "Shift_JIS",  c.UTF_8_No_BOM ) = g_VBS_Lib.Shift_JIS
詳細
c.Shift_JIS
"Shift_JIS"
vbslib の
文字コード
セットの数値
文字コード
セットの文字列
c.EUC_JP
"EUC-JP"
c.Unicode
"Unicode"
"UTF-8"
c.UTF_8_No_BOM
"UTF-8-No-BOM"
c.ISO_2022_JP
"ISO-2022-JP"
c.Unicode
"UTF-16"
in_UTF_8_CharacterCodeSet
"UTF-8" に対する vbslib の文字コード セットの数値
in_UTF_8_CharacterCodeSet 引数の値、
c.UTF_8_No_BOM
または
c.UTF_8
c.UTF_8
"UTF-8-BOM"
その他
in_CharacterCodeSetString 引数
関連
ソース
→ vbslib.vbs
ファイルの先頭行を読んで、改行文字の種類を返します。
【引数】
Path
改行文字の種類を判定するファイルのパス
Function  ReadLineSeparator( Path as string ) as integer
返り値
vbCRLF または vbLF
関連
サンプル
  f.LineSeparator = ReadLineSeparator( "File1.txt" )
(src)
テスト
→ T_File.vbs # [T_ReadLineSeparator]
ファイルによっては、改行文字の種類がバラバラになっていることもあります。
Set c = g_VBS_Lib

Assert  GetLineCount( "a", Empty ) = 1
Assert  GetLineCount( "a" +vbCRLF, Empty ) = 1
Assert  GetLineCount( "a" +vbCRLF+ "b", Empty ) = 2
Assert  GetLineCount( "a" +vbLF+   "b", Empty ) = 2
Assert  GetLineCount( "", Empty ) = 0

Assert  GetLineCount( "a", c.NoRound ) = 1
Assert  GetLineCount( "a" +vbCRLF, c.NoRound ) = 1.5
Function  GetLineCount( Text as string, RoundWay as integer )
文字列の行数をカウントします。
【引数】
Text
RoundWay
行数をカウントする文字列
通常 Empty、g_VBS_Lib.NoRound も可能
テスト
サンプル
ソース
T_GetLineCount
→ T_StrEx.vbs
→ ToolsLib.vbs
文字列の行数
返り値
RoundWay 引数には、通常 Empty を指定します。
g_VBS_Lib.NoRound を指定すると、最終行の行末が改行文字なら +0.5 します。
サンプル
line_num = GetLineCount( Left( string, position ), Empty )
position の位置の行番号を取得する
関連
行番号をカウントします
文字列の先頭からの位置から、行番号をカウントします。
処理効率を良くするため、2回目以降は前回カウントした位置からカウントを再開します。
    Set counter = new LineNumFromTextPositionClass
    counter.Text = _
        "a"+ vbCRLF + _
        "b"+ vbCRLF + _
        "cde"
    Assert  counter.GetNextLineNum( 4 )  = 2  '// "b"
    Assert  counter.GetNextLineNum( 6 )  = 2  '// vbLF
    Assert  counter.GetNextLineNum( 7 )  = 3  '// "c"
    Assert  counter.GetNextLineNum( 10 ) = 3  '// 最後の次
サンプル
→ ToolsLib.vbs
テスト
ソース
T_LineNumFromTextPosition
→ T_StrEx.vbs
関連
現在位置以降の文字列を置き換える
Property  LineNumFromTextPositionClass::Text as string  '// Get/Let
行番号を調べる対象となる文字列。
設定すると、前回調べた位置と行番号の情報はクリアされます。 参考
サンプル
関連
前回調べた位置より前にも対応した GetNextLineNum
Function  LineNumFromTextPositionClass::GetNextLineNum( Position as integer ) as integer
文字列の先頭からの位置から、行番号をカウントします。
【引数】
Position
文字列の先頭からの位置、1 以上
Position 引数に指定した位置の行番号
返り値
Position 引数は、1 = 先頭の文字です。
前回調べた位置と行番号を Me の内部に格納しており、行番号を数える処理は、その続きから行うことで、
効率よく処理します。
前回 GetNextLineNum 関数に指定した値と同じか、それ以上の値を Position 引数に指定しなければ
エラーになります。
サンプル
Function  LineNumFromTextPositionClass::GetLineNum( Position as integer ) as integer
文字列の先頭からの位置から、行番号をカウントします。
【引数】
Position
文字列の先頭からの位置
Position 引数に指定した位置の行番号
返り値
との違いは、前回調べた位置より前の位置にも対応していることです。
前回調べた位置より前の位置を Position 引数に指定したときは、文字列の先頭から数え直します。
Sub  LineNumFromTextPositionClass::ReplaceTextAtHere( SecondHalfText as string )
行番号を調べる対象となる文字列のうち、前回調べた位置とそれ以降の部分文字列を置き換えます。
で置き換える場合と異なり、前回調べた位置と行番号の情報はクリアされません。
【引数】
SecondHalfText
前回調べた位置とそれ以降に設定する行番号を調べる文字列
    Set counter = new LineNumFromTextPositionClass
    counter.SetText _
        "a"+ vbCRLF + _
        "b"+ vbCRLF + _
        "cde"
    Assert  counter.GetNextLineNum( 4 )  = 2  '// "b"

    counter.ReplaceTextAtHere _
        "XY"+ vbCRLF + _
        "c"
    Assert  counter.GetNextLineNum( 8 )  = 3  '// "c"
サンプル
ReplaceTextAtHere
a
b
cde
a
XY
c
行番号を調べる対象となる文字列は、次のように置き換わります。
Property  LineNumFromTextPositionClass::Position as integer  '// Get only
前回調べた文字列の位置。
Property  LineNumFromTextPositionClass::LineNum as integer  '// Get only
前回調べた行番号。
テスト
Function  ReadVBS_Comment( Path as string, StartTag as string, EndTag as string, Opt as Empty )
VBScript のファイルの中のコメントを、複数行の文字列として読み込みます。
【引数】
Path
StartTag
VBScript ファイルのパス、# 可能、Empty =
VBScript ファイルの中の、読み込みを開始する1つ上の行にあるキーワード
EndTag
Opt
返り値
読み込む最後の行の1つ下の行にあるキーワード
Empty を指定してください
読み込んだ文字列。 先頭に ' は付きません
サンプル
text = ReadVBS_Comment( Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", Empty )

'-------------------------------------------------------------------[FileA.txt]
'((( これはテキストファイルの代わりです )))
'
'END
'------------------------------------------------------------------[/FileA.txt]
スクリプト
text に入った値
((( これはテキストファイルの代わりです )))

END
最後の行の末尾には改行があります
→ T_FileInScript.vbs
T_ReadVBS_Comment
StartTag と EndTag に指定したキーワードがヒットしないよう、下記のサンプルにあるように + でつなぐ
などの対策をしてください。
ソース
→ vbslib.vbs
関連
Path に、URL のように # を付けると、StartTag と EndTag の一部になります。
下記の2つは同じ動きをします。  StartTag と EndTag に指定した引数は無視されます。
text = ReadVBS_Comment( "#FileA.txt", Empty, Empty, Empty )
text = ReadVBS_Comment( Empty, "["+"FileA.txt]", "[/"+"FileA.txt]", Empty )
→ WriteVBS_Comment
XML をリードするには、次のようにします。
text = ReadVBS_Comment( Empty, "["+"A.xml]", "[/"+"A.xml]", Empty )
Set root = LoadXML( text, g_VBS_Lib.StringData )
echo  root.tagName

'-------------------------------------------------------------------[A.xml]
'<Root>
'
'</Root>
'------------------------------------------------------------------[/A.xml]
Function  OpenForWrite( Path as string, Flags as integer ) as TextStream
テキストファイルを開きます。(ライト用=ファイルへ出力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、エラーメッセージに Path が付きます。
    Set w_= AppKey.NewWritable( "." ).Enable()
    Set file = OpenForWrite( "a.txt", Empty )
    file.WriteLine  "abc"
    file = Empty
サンプル
c.Unicode
Flags 引数
Empty または 次の値
Unicode 形式ファイルにします。 指定しないときは、
new_TextFileCharSetStack で指定した既定の文字コードになります。
(src)
Flags
Empty、またはオプション(下記)
c.Append
追記します。
Shift-JIS, Unicode, UTF-8(BOMあり) のときは、文字コードを指定しなくても、
元のファイルと同じ文字コードになります。
関連
→ T_File.vbs [T_OpenForWrite]
テスト
a.txt
を使うと、その他のフォーマットも指定できます。
次の値と論理和をとることもできます。
文字コードの指定は、次のどれかが指定できます。
c.Shift_JIS
c.UTF_8
c.EUC_JP
BOM 付き UTF-8
Shift-JIS
EUC(JP)
BOM なし UTF-8
c.UTF_8_No_BOM
下記の c は g_VBS_Lib です。
メソッドを使って、Out of Writable 警告が出ないようにしておいてください。
改行コードの指定は、
を使ってください。
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
→ T_File.vbs [T_OpenForWrite_Overwrite]
テキストファイルの内容を書き換えるときは、文字コード(Unicode ファイルのBOM)や改行文字を
を使ってください。
継承する
  Set cs = new_TextFileCharSetStack( "UTF-8" )
  CreateFile  "File1.txt", "abc"
サンプル
"UTF-8"
ファイルの文字 コード セットを指定します。
【引数】
CharSet
ファイルの文字 コード セット, Empty=デフォルト
デフォルト(本関数を一度も呼ばなかったとき)は、"Shift_JIS" です。
CharSet 引数に指定する文字列の大文字小文字は区別しません。
c.Unicode などの数値定数を指定することもできます。
Function  new_TextFileCharSetStack( CharSet as string ) as TextFileCharSetStack
関連
テスト
→ T_File.vbs [T_OpenForWrite]
(src)
新規作成するときの出力ファイルや、ファイルから読み込むときの文字コードを指定
します。 返り値のオブジェクトが削除されたら、指定は無効になります。
"UTF-8" は、ファイルの先頭に
BOM
が付きます。 "UTF-8-No-BOM" は付きません。
指定できる値は、レジストリの HKEY_CLASSES_ROOT\MIME\Database\Charset の
サブキーを参照してください。 ただし、"UTF-8-No-BOM" はサブキーにありません。
CharSetの例:
"Shift_JIS", "EUC-JP", "Unicode", "UTF-8", "UTF-8-No-BOM",
"ISO-8859-1", "ISO-2022-JP"
c.Shift_JIS, c.EUC_JP, c.Unicode, c.UTF_8, c.UTF_8_No_BOM,
c.ISO_2022_JP, c.No_BOM(=c.Shift_JIS), Empty(=c.Shift_JIS)
BOM を付けないときは XML の encoding や HTML の charset などを用いて文字
コードを記述しなければ、多くのプログラムは文字化けを起こします。 一方で、
BOM があるとエラーを起こす UTF-8 に対応していないプログラムも多くあります。
<?xml version="1.0" encoding="UTF-8"?>
XML の場合
<META http-equiv="content-type" content="text/html; charset=UTF-8"/>
HTML の場合
UTF-8
UTF-8
ファイルの先頭にある BOM を読みます。
XML ファイルの文字コードを指定します。
文字コードセットを変換します。
vbslib では、解析を行いません。
現在指定されている文字 コード セットは、
で取得できます。
Function  Decode_MIME_HeaderLine( Line as string ) as string
str = Decode_MIME_HeaderLine( "Subject: =?ISO-2022-JP?B?YWJjGyRCJUYlOSVIGyhCZGVm?=" )
Assert  str = "Subject: abcテストdef"
MIME ヘッダーの1行を "=? … ?=" 形式から、通常の文字列に戻します。
【引数】
Line
MIME ヘッダーの1行
Line からでコードした通常の文字列
返り値
テスト
サンプル
ソース
T_MIME
参考
→ MIME
→ ISO-2022-JP
→ Base64
関連
→ T_Binary.vbs
→ System.vbs
文字コードの変換
(src)
ファイルの改行文字コードを指定します。
【引数】
LS
ファイルの改行文字コード、または Empty
Function  new_TextFileLineSeparatorStack( LS as string ) as TextFileLineSeparatorStack
 返り値のオブジェクトが削除されたら、指定は無効になります。
LS 引数
vbCRLF, g_VBS_Lib.CRLF
vbLF, g_VBS_Lib.LF
g_VBS_Lib.KeepLineSeparators
Empty
リードするときは改行文字を自動判定、ライトするときは CR+LF、修正するとき(*下記)は
改行文字の種類を継承します。
CR+LF
LF
改行文字の種類を継承する(下記)
Dim ls : Set ls = new_TextFileLineSeparatorStack( g_VBS_Lib.KeepLineSeparators )
Set f  = OpenForRead( Path )
ls = Empty
text = f.ReadLine()
サンプル
参考
など、修正前のテキストと修正後のテキストの両方を指定する vbslib
「改行文字の種類を継承する」 とは、入力ファイルに書かれた改行文字の種類が、1行
単位で、そのまま出力ファイルに書かれることです。 1つのファイルに複数の改行文字の
種類が混ざっていても、そのまま継承されることです。
TextStream::WriteLine に渡すテキストの末尾に vbCRLF または vbLF を付けることが
できます。 付けたときは、その種類の改行文字が出力され、TextStream::WriteLine に
よって自動的に改行文字を付けることはなくなります。 また、デフォルトの改行文字も
指定した種類に変更されます。  改行文字を付けなかったときは、デフォルトの改行
文字が自動的に付きます。 つまり、TextStream::ReadLine で入力した1行をそのまま
TextStream::WriteLine に出力すると、改行文字の種類は継承され、末尾に改行文字
を付けない新たな1行を TextStream::WriteLine に出力すると、前の行の改行文字の
種類を継承します。
自動判定 (下記)
の関数を使ったときは、その関数の中で改行文字の種類の継承処理が行われます。
を使って、入力ファイルの先頭行の改行文字の種類を
判定して、出力ファイルのデフォルト改行文字の種類を設定します。
入力ファイル、出力ファイル、ともに、g_VBS_Lib.KeepLineSeparators (上記) のモード
を使うように、new_TextFileLineSeparatorStack を呼び出します。
TextStream::ReadLine の返り値である1行のテキストの末尾に改行文字が加わります。
改行文字は、ファイルの内容によって、LF または CR+LF のどちらかになります。
ただし、最終行の末尾に改行文字が無いときだけ、改行文字は加わりません。
はじめに、
関連
そうではなく、OpenForRead などを使ってテキストをリードして、OpenForWrite などを
使ってテキストをライトする処理をプログラミングするときは、以下で説明する詳細な
手順を参考に、改行文字の継承を行ってください。
KeepLineSeparators モードでは、TextStream::ReadLine や TextStream::WriteLine に
よってアクセスする1行のテキストの内容が、次のように変わります。
テスト
→ T_Replace.vbs # T_StartReplace_KeepRet_1
→ T_File.vbs # T_OpenFile_LineSepFromFS
TextStream::WriteLineDefault を使うと、渡したテキストの改行文字を、デフォルトの
改行文字に置き換え、渡したテキストの最後に改行文字を追加して、出力します。